#===============================================================================
# Koro Business Environment
# Copyright (C) 2008  Antonio Corroppoli
#
#This file is part of Koro BE.
# 
# Koro BE is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
# 
# Koro BE is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with Koro BE; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
#===============================================================================



print 'import context'
import os
import datetime
from sqlalchemy import exc
#from decimal import Decimal
from koro import util#TEMPLATE_PATH,TEMPLATE_FATTURA,PDF_PATH,PDF_VIEWER,util
#import koro.ui.wxgui.guifacade
#view=koro.ui.wxgui.guifacade.GuiFacade
from koro.db import database,persister
#from koro.ui import view
from koro.core import model,exception

#from koro.modules.agenda.context import AgendaContext
#from koro.modules.agenda.model import Agenda


#===============================================================================
# Context
#===============================================================================
class Context(object):
    def __init__(self,context=None):
        self._context=context
    
    def commit(self):
        database.get_instance().commit()
    
    def get_object_class(self):
        return self._context
    
    def get_object(self,*args,**kwargs):
        obj_list=self.get_objects(*args,**kwargs)
        if len(obj_list)==0:
            return None
        return obj_list[0]
    
    def get_objects(self,*args,**kwargs):
        query=database.get_instance().query(self._context)
        query=self._configure_query(query)
        if len(kwargs)>0:
            query=query.filter_by(**kwargs)
        if len(args)>0:
            for a in args:
                query=query.filter(a)
        return query.all()
    
    def _configure_query(self,query):
        '''Questo metodo serve a personalizzare la query che restituisce tutti gli oggetti.
        Override in subclass se necessario.'''
        return query
    
    def save_object(self,obj):
#        obj.validate()
#        obj.pending=False
        database.get_instance().validate_and_save(obj)
    
    def autosave_object(self,obj):
        try:
            self.save_object(obj)
        except exception.KoroInvalidObject:
            self.autodelete_object(obj)
        except exc.IntegrityError:
            database.get_instance().rollback()
            
            #raise exception.KoroIntegrityError(inst.params,inst.orig)
        #database.get_instance().flush()
    
    def delete_object(self,obj):
        database.get_instance().delete(obj)
    
    def autodelete_object(self,obj):
        if obj.is_pending_object():
            self.delete_object(obj)
        else:
            self.expire_object(obj)
    
    def expire_object(self,obj):
        database.get_instance().expire(obj)
    
    def refresh_object(self,obj):
        database.get_instance().refresh(obj)
    
    def expunge_object(self,obj):
        database.get_instance().expunge(obj)
    
    def new_object(self):
        new_object=self._context()
        self._configure_new_object(new_object)
        database.get_instance().save(new_object)
        return new_object
    
    def _configure_new_object(self,obj):
        '''Questo metodo serve a configurare il nuovo oggetto durante fa fase di creazione.
        Override in subclass se necessario.'''
        pass
    
    def update_object(self,obj):
        self.save_object(obj)
    
    def _get_options(self):
        query=database.get_instance().query(model.Opzione)
        op=model.Opzioni()
        op.extend(query.all())
        return op
    
    def lookup(self,**kwargs):
        filters=[]
        for k in kwargs:
            filters.append(getattr(self._context,k).contains(kwargs[k]))
        filters=tuple(filters)       
        return self.get_objects(*filters)
    
    def svuota_cestino(self,obj):
        if not hasattr(obj,'cestino'):
            return
        db_instance=database.get_instance()
        for item in obj.cestino:
            db_instance.remove(item)
        db_instance.flush()   
        

##===============================================================================
## ClientiContext
##===============================================================================
#class ClientiContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.ClienteFornitore)
#
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(self._context).filter_by(tipo=u'C')
#        if len(kwargs)>0:
#            return query.filter_by(**kwargs).all()
#        if len(args)>0:
#            return query.filter(*args).all()
#        return query.all()        
#
#    def save_object(self,obj):
#        obj.tipo='C'
#        if obj.fk_listino is None:
#            obj.fk_listino=self._get_options().LISTINO_DEFAULT_VENDITA
#        if obj.fk_iva is None:
#            obj.fk_iva=self._get_options().IVA_DEFAULT
#        database.get_instance().save(obj)  
#
#
##===============================================================================
## FornitoriContext
##===============================================================================
#class FornitoriContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.ClienteFornitore)
#
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(self._context).filter_by(tipo=u'F')
#        if len(kwargs)>0:
#            return query.filter_by(**kwargs).all()
#        if len(args)>0:
#            return query.filter(*args).all()
#        return query.all()
#
#    def save_object(self,obj):
#        obj.tipo='F'
#        if obj.fk_listino is None:
#            obj.fk_listino=self._get_options().LISTINO_DEFAULT_ACQUISTO
#        if obj.fk_iva is None:
#            obj.fk_iva=self._get_options().IVA_DEFAULT
#        database.get_instance().save(obj)


##===============================================================================
## ProdottiContext
##===============================================================================
#class ProdottiContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Prodotto)
#    
#    def aggiorna_prezzi(self,*args,**kwargs):
#        listino=args[0]
#        prodotti=database.get_instance().query(models.Prodotto).all()
#        for prodotto in prodotti:
#            p=prodotto._get_prezzo(listino.get_listino_ricarico()).prezzo
#            ric=Decimal(p/100*Decimal(listino.ricarico))
#            prezzo=prodotto._get_prezzo(listino.codice)
#            #prezzo=models.PrezzoProdotto()
#            prezzo.fk_listino=listino.codice
#            prezzo.set_prodotto(prodotto.ID)
#            prezzo.set_prezzo(p+ric)
#            database.get_instance().add(prezzo)
#        database.get_instance().commit()
#
#
##===============================================================================
## CategorieProdottiContext
##===============================================================================
#class CategorieProdottiContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.CategoriaProdotto)
#
#    def viewPage(self):
#        print 'CategorieProdottiContext.viewPage'        
#        view.get_instance().viewCategorieProdottiPage(self.get_objects())
#
#    def get_objects(self,*args,**kwargs):        
#        query=database.get_instance().query(self._context)
#        if len(kwargs)>0:
#            return query.filter_by(**kwargs).all()
#        if len(args)>0:
#            return query.filter(*args).all()
#        return query.all()
#        #problema: fare deepcopy?
#
#    def save_object(self,obj):
#        database.get_instance().save(obj)
##        global cont
##        idx=obj.get_ID()
##        if idx=="" or idx==0 or idx is None:
##            obj.set_ID(cont)
##            cont+=1
##            categProdotti.append(obj)
#
#    def delete_object(self,obj):
#        database.get_instance().delete(obj)
#
#    def new_object(self):
#        return models.CategoriaProdotto()
#
#    def update_object(self,obj):
#        self.save_object(obj)

##===============================================================================
## OrdiniContext
##===============================================================================
#class OrdiniContext(Context):
#    def __init__(self,context,id_tipo_mov):
#        Context.__init__(self,context)
#        self.id_tipo_mov=id_tipo_mov
#
#    def save_object(self,obj):
#        if obj.fk_stato==obj.NUOVO:
#            obj.fk_stato=obj.CONFERMATO
#        database.get_instance().save(obj)
#    
#    def concludi_ordine(self,*args,**kwargs):
#        ordine=args[0]
#        doc=args[1]
#        ordine.set_concluso()
#        ordine.rif_documento=doc.ID        
#        #movimenti magazzino
#        self._movimenta_magazzino(ordine)
#        database.get_instance().commit()
#    
#    def _movimenta_magazzino(self,ordine):
#        if not util.to_bool(self._get_options().GESTIONE_MAGAZZINO):
#            return
#        for riga in ordine.dettaglio:
#            if not riga.da_movimentare():
#                continue
#            mm=model.MovimentoMagazzino()
#            tipo=database.get_instance().query(models.TipoMovimento).\
#            filter_by(ID=self.id_tipo_mov).first()
#            mm.set_tipo_movimento(tipo)
#            mm.set_prodotto(riga.prodotto)
#            mm.set_quantita(riga.get_quantita())
##            if hasattr(ordine,'rif_fattura'):
##                mm.rif_doc=ordine.rif_fattura        
#            database.get_instance().add(mm)        
#    
##    def concludi_ordine(self,*args,**kwargs):
##        '''non va bene'''
##        print 'concludi',args,kwargs
##        ordine=args[0]
##        #ordine.fk_stato=self._context.CONCLUSO
##        ordine.set_concluso()
##        data_oggi=datetime.date.today()
##        arrivo=None
##        if isinstance(ordine,models.OrdineFornitore):
##            arrivo=models.Documento()
##            arrivo.numero=ArriviMerceContext.get_next_num()
##            ArriviMerceContext.set_current_num(arrivo.numero)
##            arrivo.fk_tipo_documento=arrivo.ARRIVO_MERCE
##            arrivo.fk_intestatario=ordine.fk_fornitore
##            arrivo.data=data_oggi
##            arrivo.reg_fattura=False
##            database.get_instance().save(arrivo)#verificare se metterlo dopo creazione dettaglio
##            ordine.rif_arrivo=arrivo.ID
##        
##        #movimenti magazzino e arrivo merce
##        for riga in ordine.dettaglio:
##            #arrivo merce            
##            if isinstance(ordine,models.OrdineFornitore):
##                #add_riga e' deprecato
##                arrivo.dettaglio.add_riga(prodotto=riga.prodotto,
##                                          prezzo=riga.prezzo,
##                                          quantita=riga.quantita,
##                                          perc_iva=riga.perc_iva)
##                
##            #movimenti magazzino
##            if riga.da_movimentare():
##                self.movimenta_magazzino(riga)
##                
##        if isinstance(ordine,models.OrdineCliente):
##            self.genera_fattura(ordine)
##        database.get_instance().commit()
##        
##    def conferma_ordine(self,*args,**kwargs):
##        '''attualmente non viene usato'''
##        print 'conferma',args,kwargs
##        ordine=args[0]
##        ordine.fk_stato=self._context.CONFERMATO
##        self.save_object(ordine)
#    
#    def tipi_stato_ordine(self,*args,**kwargs):
#        query=database.get_instance().query(models.TipiStatoOrdine)
#        if len(kwargs)>0:
#            query=query.filter_by(**kwargs)
#        if len(args)>0:
#            query=query.filter(*args)
#        return query.all()
#    
#    def da_concludere(self,*args,**kwargs):
#        return self.get_objects(fk_stato=models.Ordine.CONFERMATO)
    
#    
##===============================================================================
## OrdiniFornitoreContext
##===============================================================================
#class OrdiniFornitoreContext(OrdiniContext):
#    def __init__(self):
#        super(OrdiniFornitoreContext,self).__init__(context=models.OrdineFornitore,
#                                                    id_tipo_mov=models.MovimentoMagazzino.CARICO)
#    def genera_arrivo_merce(self,*args,**kwargs):
#        ordine=args[0]
#        #ordine.set_concluso()
#        #data_oggi=datetime.date.today()
#            
#        arrivo=models.Documento()
#        arrivo.numero=-1#ArriviMerceContext.get_next_num()
#        #ArriviMerceContext.set_current_num(arrivo.numero)
#        arrivo.fk_tipo_documento=arrivo.ARRIVO_MERCE
#        #arrivo.fk_intestatario=ordine.fk_fornitore
#        arrivo.set_intestatario(ordine.intestatario)
#        arrivo.data=datetime.date.today()
#        arrivo.reg_fattura=False
#        arrivo.totale_imponibile=ordine.totale_imponibile
#        arrivo.totale_iva=ordine.totale_iva
#        arrivo.spese_descr=ordine.spese_descr
#        arrivo.spese_fk_iva=ordine.spese_fk_iva
#        arrivo.spese_importo=ordine.spese_importo
#        
#        #database.get_instance().save(arrivo)#verificare se metterlo dopo creazione dettaglio
#        #ordine.rif_arrivo=arrivo.ID
#        
#        #movimenti magazzino e arrivo merce
#        for riga in ordine.dettaglio:
#            arrivo.dettaglio.add_riga_(prodotto=riga.prodotto,
#                                     prezzo=riga.prezzo,
#                                     quantita=riga.quantita,
#                                     iva_riga=riga.iva_riga,
#                                     codice_iva=riga.codice_iva,
#                                     sconti=riga.sconti)            
##            #movimenti magazzino
##            if riga.da_movimentare():
##                self.movimenta_magazzino(riga)
##                
##        database.get_instance().commit()
#        return arrivo    
# 
##===============================================================================
## OrdiniClienteContext
##===============================================================================
#class OrdiniClienteContext(OrdiniContext):
#    def __init__(self):
#        super(OrdiniClienteContext,self).__init__(context=models.OrdineCliente,
#                                                  id_tipo_mov=models.MovimentoMagazzino.SCARICO)
#    
#    def genera_fattura(self,*args,**kwargs):
#        ordine=args[0]
#        fatt=models.Documento()
#        fatt.fk_tipo_documento=models.Documento.FATTURA
#        fatt.numero=FattureContext.get_next_num()
#        fatt.data=datetime.date.today()#ordine.data
#        fatt.set_intestatario(ordine.intestatario)
##        #fatt.totale=ordine.totale
#        fatt.totale_imponibile=ordine.totale_imponibile
#        fatt.totale_iva=ordine.totale_iva
#        fatt.spese_descr=ordine.spese_descr
#        fatt.spese_fk_iva=ordine.spese_fk_iva
#        fatt.spese_importo=ordine.spese_importo
#        
#        for riga in ordine.dettaglio:            
#            fatt.dettaglio.add_riga_(prodotto=riga.prodotto,
#                                     prezzo=riga.prezzo,
#                                     quantita=riga.quantita,
#                                     iva_riga=riga.iva_riga,
#                                     codice_iva=riga.codice_iva,
#                                     sconti=riga.sconti)
#        #database.get_instance().save(fatt)
#        #FattureContext.set_current_num(fatt.numero)
#        #ordine.concluso=True
#        #ordine.rif_documento=fatt.ID
#        #database.get_instance().save(ordine)
#        return fatt
#    
#    def genera_documento(self,*args,**kwargs):
#        ordine=args[0]
#        tipo_doc=args[1]
#        doc=None
#        if tipo_doc.ID==models.Documento.FATTURA:
#            doc=self.genera_fattura(ordine)
#            doc.tipo_documento=tipo_doc
#        return doc        
#    
#        #doc=self.genera_documento(ordine,tipo_doc)
#        #return doc
#    
#    def get_tipi_documento(self,*args,**kwargs):
#        query=database.get_instance().query(models.TipoDocumento)
#        query=query.filter(models.TipoDocumento.ID<models.Documento.ARRIVO_MERCE)
#        objects=query.all()
#        return objects 
#
#
##===============================================================================
## VenditaBancoContext
##===============================================================================
#class VenditaBancoContext(Context):
#    def __init__(self):
#        super(VenditaBancoContext,self).__init__(context=models.VenditaBanco)
#    
#    def save_object(self,obj):
#        print self.__class__.__name__,'save_object'
#        database.get_instance().save(obj)
#    
#    def scarica_magazzino(self,*args,**kwargs):
#        print self.__class__.__name__,'.scarica_magazzino'
#        obj=args[0]
#        self.cancella_movimenti(obj.ID)
#        for riga in obj.dettaglio:            
#            #movimenti magazzino. questo codice e' ripetuto per gli ordini! fare qualcosa
#            if riga.da_movimentare():
#                mm=models.MovimentoMagazzino()
#                #causale=database.get_instance().query(models.TipoMovimento).\
#                #filter_by(ID=models.MovimentoMagazzino.SCARICO).first()
#                mm.fk_tipo_movimento=models.MovimentoMagazzino.SCARICO_BANCO
#                mm.set_prodotto(riga.prodotto)
#                #mm.fk_prodotto=riga.prodotto.ID
#                mm.set_quantita(riga.get_quantita())
#                mm.rif_doc=obj.ID
#                mm.note="Da vendita al banco numero {0}".format(obj.ID)                        
#                database.get_instance().add(mm)
#                #riga.set_movimentata()
#        database.get_instance().commit()    
#        #database.get_instance().save(obj)#TODO:controllare se qui effettivamente salva le righe
#        print 'fine scarica magazz'
#    
#    def cancella_movimenti(self,*args,**kwargs):
#        vendita_ID=args[0]
#        database.get_instance().query(models.MovimentoMagazzino).\
#        filter_by(fk_tipo_movimento=models.MovimentoMagazzino.SCARICO_BANCO).\
#        filter_by(rif_doc=vendita_ID).delete()
#        database.get_instance().commit()
#    
#    def genera_fattura(self,*args,**kwargs):
#        obj=args[0]
#        fatt=models.Documento()
#        fatt.fk_tipo_documento=models.Documento.FATTURA
#        fatt.numero=FattureContext.get_next_num()
#        fatt.data=obj.data
#        fatt.fk_intestatario=obj.fk_cliente
#        for riga in obj.dettaglio:            
#            fatt.dettaglio.add_riga(prodotto=riga.prodotto,
#                                    prezzo=riga.prezzo,
#                                    quantita=riga.quantita,
#                                    perc_iva=riga.perc_iva)
#        database.get_instance().save(fatt)
#        FattureContext.set_current_num(fatt.numero)
#        obj.fatturato=True
#        obj.rif_documento=fatt.ID
#        database.get_instance().save(obj)
#        return fatt.numero
#                
#
# 
##===============================================================================
## ListiniContext
##===============================================================================
#class ListiniContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Listino)
#    
#    def delete_object(self,obj):
#        database.get_instance().query(models.PrezzoProdotto).filter_by(fk_listino=obj.codice).delete()
#        database.get_instance().commit()
#        database.get_instance().delete(obj)
#    
#    def listini_senza_ricarico(self,*args,**kwargs):
#        return self.get_objects(ricarico_flag=False)

##===============================================================================
## CodiciIvaContext
##===============================================================================
#class CodiciIvaContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Iva)
#
#    def viewPage(self):
#        print 'CodiciIvaContext.viewPage'        
#        view.get_instance().render(self._context,self.get_objects())
#
#    #def get_objects(self,*args,**kwargs):
#        #return database.get_instance().load(self._context)#problema: fare deepcopy?
#
#    def save_object(self,obj): 
#        database.get_instance().save(obj)       
##        codice=obj.codice
##        for item in codici_iva:
##            if item.codice==codice:
##                return      
##        codici_iva.append(obj)
#
#    def delete_object(self,obj):
#        database.get_instance().delete(obj)
#
#    def new_object(self):
#        return models.Iva()
#    
#    def update_object(self,obj):
#        self.save_object(obj)


##===============================================================================
## MovimentiContext
##===============================================================================
#class MovimentiContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.MovimentoMagazzino)
#
##    def viewPage(self):
##        print 'MovimentiContext.viewPage'        
##        view.get_instance().render(self._context,self.get_objects())
#
#    def get_objects(self,*args,**kwargs):
#        return database.get_instance().load(self._context)#problema: fare deepcopy?
#
#    def save_object(self,obj): 
#        database.get_instance().save(obj)     
#
#    def delete_object(self,obj):
#        database.get_instance().delete(obj)
#
#    def new_object(self):
#        return models.MovimentoMagazzino()
#    
#    def update_object(self,obj):
#        self.save_object(obj)
#        
#    def get_causali_movimento(self):
#        return database.get_instance().load(models.TipoMovimento)


##===============================================================================
## InventarioContext
##===============================================================================
#class InventarioContext(Context):
#    def __init__(self):
#        Context.__init__(self)
#    
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(models.Prodotto)
#        if len(kwargs)>0:
#            query=query.filter_by(**kwargs)
#        if len(args)>0:
#            for a in args:
#                query=query.filter(a)
#        prodotti=query.all()
#        for prodotto in prodotti:
#            setattr(prodotto,'giacenza',self._get_giacenza(prodotto.ID))
#        return prodotti
#        
#    def _get_giacenza(self,id_prodotto):
#        query=database.get_instance().query("giacenza")
#        statement='select sum(quantita*causali_movimento.segno) as giacenza\
#        from movimenti_magazzino, causali_movimento \
#        where fk_prodotto={0} and \
#        movimenti_magazzino.fk_causale=causali_movimento.ID'.format(id_prodotto)
#        query=query.from_statement(statement)
#        giacenza=query.scalar()
#        if giacenza is None:
#            return 0
#        return giacenza
#    
#    def save_object(self,obj):
#        raise Exception('Metodo non disponibile.')
#    
#    def delete_object(self,obj):
#        raise Exception('Metodo non disponibile.')
#    
#    def new_object(self):
#        raise Exception('Metodo non disponibile.')
#    
#    def update_object(self,obj):
#        raise Exception('Metodo non disponibile.')


##===============================================================================
## ArriviMerceContext
##===============================================================================
#class ArriviMerceContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Documento)
#
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(self._context).filter_by(fk_tipo_documento=models.Documento.ARRIVO_MERCE)
#        if len(kwargs)>0:
#            return query.filter_by(**kwargs).all()
#        if len(args)>0:
#            return query.filter(*args).all()
#        return query.all()
#    
##    @staticmethod
##    def get_next_num(*args,**kwargs):
##        curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.ARRIVO_MERCE).one()
##        return curr.contatore+1
##    
##    @staticmethod
##    def set_next_num(*args,**kwargs):
##        ArriviMerceContext.set_current_num(int(args[0])-1)
##    
##    @staticmethod
##    def set_current_num(*args,**kwargs):
##        curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.ARRIVO_MERCE).one()
##        curr.contatore=args[0]
##        database.get_instance().save(curr)        
#
#    def save_object(self,obj):
#        obj.fk_tipo_documento=models.Documento.ARRIVO_MERCE
#        obj.numero=0
#        database.get_instance().save(obj)
#        #self.set_current_num(obj.numero)
#    
#    def new_object(self):
#        doc=models.Documento()
#        doc.fk_tipo_documento=models.Documento.ARRIVO_MERCE
#        #curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.ARRIVO_MERCE).one()
#        doc.numero=0
#        return doc
    

#===============================================================================
# FattureFornitoreContext
#===============================================================================
class RegistrazioniContext(Context):
    def __init__(self):
        Context.__init__(self,models.Registrazione)

    def get_objects(self,*args,**kwargs):
        query=database.get_instance().query(self._context) 
        if len(kwargs)>0:
            query=query.filter_by(**kwargs)
        if len(args)>0:
            for a in args:
                query=query.filter(a)
        return query.all()

    def save_object(self,obj):
        obj.fk_tipo_documento=models.Documento.ARRIVO_MERCE
        obj.numero=0
        database.get_instance().save(obj)
        #self.set_current_num(obj.numero)
    
    def new_object(self):
        doc=models.Documento()
        doc.fk_tipo_documento=models.Documento.ARRIVO_MERCE
        #curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.ARRIVO_MERCE).one()
        doc.numero=0
        return doc


##===============================================================================
## FattureContext
##===============================================================================
#class FattureContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Documento)
#
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(self._context).filter_by(fk_tipo_documento=models.Documento.FATTURA)
#        if len(kwargs)>0:
#            return query.filter_by(**kwargs).all()
#        if len(args)>0:
#            return query.filter(*args).all()
#        return query.all()
#    
#    @staticmethod
#    def get_next_num(*args,**kwargs):
#        curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.FATTURA).one()
#        return curr.contatore+1
#    
#    @staticmethod
#    def set_next_num(*args,**kwargs):
#        FattureContext.set_current_num(int(args[0])-1)
#    
#    @staticmethod
#    def set_current_num(*args,**kwargs):
#        curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.FATTURA).one()
#        curr.contatore=args[0]
#        database.get_instance().add(curr)        
#
#    def save_object(self,obj):
#        obj.fk_tipo_documento=models.Documento.FATTURA
#        #database.get_instance().add(obj)
#        if obj.ID is None:
#            obj.numero=self.get_next_num()
#            self.set_current_num(obj.numero)
#        database.get_instance().add(obj)
#        database.get_instance().commit()
#    
#    def new_object(self):
#        doc=models.Documento()
#        doc.fk_tipo_documento=models.Documento.FATTURA
#        curr=database.get_instance().query(models.Contatore).filter_by(fk_tipo_documento=models.Documento.FATTURA).one()
#        doc.numero=curr.contatore+1
#        return doc
#    
#    def crea_pdf(self,*args,**kwargs):
#        import ho.pisa as pisa
#        obj=args[0]        
#        azienda=OpzioniContext.get_dati_azienda()#qui c'e' un problema
#        indirizzo=(azienda.get_via(),azienda.get_cap(),azienda.get_citta(),azienda.get_provincia())
#        dati_azienda='<b>{ragione_sociale}</b><br> \
#        {0} - {1} - {2} ({3}) <br> \
#        P.IVA {piva}<br> \
#        C.Fisc. {codfisc}<br> \
#        Mobile:{cellulare} Fax:{fax}<br> \
#        E-Mail:{email}<br> \
#        Web:{sitoweb}'.format(*indirizzo,**azienda.__dict__)
#        c=obj.intestatario
#        indirizzo=(c.get_via(),c.get_cap(),c.get_citta(),c.get_provincia())
#        dati_cliente='{ragione_sociale}<br>{0}<br>{1} {2} {3}<br> \
#        P.IVA:{piva} &nbsp&nbsp&nbsp C.F.: {codfisc}'.format(*indirizzo,**c.__dict__)
#
#        dict_={'dati_azienda':dati_azienda,
#           'numero':obj.numero,
#           'cliente':dati_cliente,
#           'data':datetime.date.today().strftime('%d/%m/%Y'),
#           }
#        classe_riga=('even','odd')
#        template_row='<tr class={classe_riga}> \
#        <td class=prodotto>{codice} - {descrizione}</td> \
#        <td class=prezzo>{prezzo}</td> \
#        <td class=qta>{quantita}</td> \
#        <td class=totale>{totale_riga}</td> \
#        <td class=iva>{perc_iva}%</td> \
#        </tr>'
#        dettaglio=''
#        for cont,riga in enumerate(obj.dettaglio):
#            riga.classe_riga=classe_riga[cont%2]
#            riga.descrizione=riga.prodotto.descrizione
#            riga.codice=riga.prodotto.codice
#            riga.totale_riga=riga.get_totale()
#            dettaglio+=template_row.format(**riga.__dict__)
#        dict_['dettaglio']=dettaglio
#        obj.calcola_totali()
#        dict_['totale_imponibile']=obj.totale_imponibile
#        dict_['totale_iva']=obj.totale_iva
#        dict_['totale']=obj.get_totale()        
#        source=os.path.join(TEMPLATE_PATH,TEMPLATE_FATTURA)
#        source_obj=open(source)
#        source=source_obj.read()
#        filename='fattura_{0}_del_{1}.pdf'.format(obj.numero,obj.data.strftime('%d_%m_%Y'))
#        output_path=os.path.join(PDF_PATH,filename)
#        output=open(output_path,"wb")
#        pdf=pisa.CreatePDF(source.format(**dict_),output)
#        source_obj.close()
#        output.close()
#        if not pdf.err:
##            cmd='{0} {1}'.format(PDF_VIEWER,output_path)
#            #os.system(cmd)
#            return output_path
#        return None



    
    
#===============================================================================
# LavagnaContext
#===============================================================================
#class LavagnaContext(Context):
#    def __init__(self):
#        Context.__init__(self,models.Lavagna)
#    
#    def render(self):
#        pass
#
#    def get_objects(self,*args,**kwargs):
#        query=database.get_instance().query(self._context).filter_by(ID=0)
#        return query.one()
#    
#    def save_object(self,obj):
#        obj.ID=0
#        database.get_instance().save(obj)


#===============================================================================
# OpzioniContext
#===============================================================================
class OpzioniContext(Context):
    def __init__(self):
        Context.__init__(self,model.Opzione)
    
    def get_objects(self,*args,**kwargs):
        query=database.get_instance().query(self._context)
        op=model.Opzioni()
        op.extend(query.all())
        op.set_dirty(False)
        return op
    
    def save_object(self,obj):
        for opt in obj:
            database.get_instance().save(opt)
        obj.set_dirty()
    
    def get_info_connessione(self,*args,**kwargs):
        d=database.get_instance().get_connection_info()
        info=model.InfoConnessione()
        info.update(d)
        return info
    
    def save_info_connessione(self,*args,**kwargs):
        database.get_instance().save_connection_info(args[0])
    
    def save_enabled_modules(self,data):
        persister.ObjectPersister.put('ENABLED_MODULES', data)        
    
#    @staticmethod #TODO: da eliminare. esiste per fa funzionare crea_pdf (per le prove)
#    def get_dati_azienda(*args,**kwargs):
#        query=database.get_instance().query(Azienda)
#        azienda=query.first()
#        if azienda is None:
#            azienda=Azienda()
#        return azienda
#    
#    def save_dati_azienda(self,*args,**kwargs):
#        database.get_instance().save(args[0])


##===============================================================================
## HomeContext
##===============================================================================
#class HomeContext(Context):
#    
#    def __init__(self):
#        Context.__init__(self)
#        print 'home context'
#    
##    def get_memo(self,*args,**kwargs):
##        print 'ooooooooooooooooooooooooo'
##        self._context=Agenda
##        return self.get_objects(*args,**kwargs)
##
##    def render(self):
##        print 'Context.render'   
##        view.get_instance().show_home_page()
#    
#    def get_object_class(self):
#        return self._context
#    
#    def get_objects(self,*args,**kwargs):
#        if self._context is None:
#            return []
#        query=database.get_instance().query(self._context)
#        if len(kwargs)>0:
#            query=query.filter_by(**kwargs)
#        if len(args)>0:
#            query=query.filter(*args)
#        return query.all()
#    
#    def save_object(self,obj):
#        database.get_instance().save(obj)
#    
#    def delete_object(self,obj):
#        database.get_instance().delete(obj)
#    
#    def new_object(self):
#        raise Exception('Metodo non disponibile.')
#    
#    def update_object(self,obj):
#        self.save_object(obj)

